package tests;

import java.io.IOException;

import junit.framework.TestCase;
import lz77.CompressedData;
import lz77.FileHandler;
import lz77.util.ByteLinkedList;
import lz77.util.CharLinkedList;
import lz77.util.LinkedListNode;

public class FileHandlerTest extends TestCase {

	CompressedData cd;

	protected void setUp() throws Exception {
		super.setUp();
		cd = new CompressedData((char) 10);
	}

	public void testFileHandler() throws IOException {
		cd.add((char) 0);
		cd.add((byte) 'a');
		cd.add((char) 0);
		cd.add((byte) 'b');
		cd.add((char) 0);
		cd.add((byte) 'c');
		cd.add((char) 0);
		cd.add((byte) 'd');
		cd.add((char) 0);
		cd.add((byte) 'e');
		cd.add((char) 2);
		cd.add((char) 3);
		cd.add((byte) '\n');

		FileHandler.writeCompressedFile("test_compressed", cd);
		CompressedData tmp = FileHandler.readCompressedFile("test_compressed");

		LinkedListNode cd_node = cd.head();
		LinkedListNode tmp_node = tmp.head();

		assertEquals(cd.getSize(), tmp.getSize());

		while (cd_node != null && tmp_node != null) {
			if (cd_node instanceof CharLinkedList) {
				CharLinkedList node1,node2;
				node1 = (CharLinkedList) cd_node;
				node2 = (CharLinkedList) tmp_node;
				assertEquals(node1.value,node2.value);
			} else if (cd_node instanceof ByteLinkedList) {
				ByteLinkedList node1,node2;
				node1 = (ByteLinkedList) cd_node;
				node2 = (ByteLinkedList) tmp_node;
				assertEquals(node1.value,node2.value);
			} else {
				fail();
			}
			cd_node = cd_node.next();
			tmp_node = tmp_node.next();
		}

		assertNull(cd_node);
		assertNull(tmp_node);
	}

}
